package com.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;


@Aspect
@Component
public class LoggerAspect {

	@Around(value = "execution(* com.service.ProductService.*(..))")
	public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
		
		// ProceedingJoinPoint
		/*
		环绕通知 ProceedingJoinPoint 执行proceed方法的作用是让目标方法执行，这也是环绕通知和前置、后置通知方法的一个最大区别。
		简单理解，环绕通知=前置+目标方法执行+后置通知，proceed方法就是用于启动目标方法执行的.
		 */
		System.out.println("start log:"+ joinPoint.getSignature().getName());
		Object proceed = joinPoint.proceed();
		System.out.println("end log:" + joinPoint.getSignature().getName());
		
		return proceed;
	}
}
